package main

import "fmt"

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

/*Golang 新建Traversal函数 ，注意slice切片append时新构建一个切片，需要使用指针*/
func inorderTraversal(root *TreeNode) []int {
	res := make([]int, 0)
	Traversal(root, &res)
	return res
}
func Traversal(root *TreeNode, res *[]int) {
	if root == nil {
		return
	}
	Traversal(root.Left, res)
	*res = append(*res, root.Val)
	Traversal(root.Right, res)
}

/*golang使用内联函数  绕过slice作为函数参数 在使用append的时候会新构建一个slice  导致无法修改原slice的值的问题*/
func inorderTraversal2(root *TreeNode) []int {
	var res []int
	var Traversal2 func(root *TreeNode)
	Traversal2 = func(root *TreeNode) {
		if root == nil {
			return
		}
		Traversal2(root.Left)
		res = append(res, root.Val)
		Traversal2(root.Right)
	}
	Traversal2(root)
	return res
}
func main() {
	root := &TreeNode{Val: 1}
	root.Right = &TreeNode{Val: 2}
	root.Right.Left = &TreeNode{Val: 3}

	res := inorderTraversal2(root)
	fmt.Println(res)
}
